package cn.wolfcode.web.interceptor;

import cn.wolfcode.anno.RequiredPermission;
import cn.wolfcode.domain.Employee;
import cn.wolfcode.domain.Permission;
import cn.wolfcode.domain.Role;
import cn.wolfcode.service.IPermissionService;
import cn.wolfcode.service.IRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * 访问权限拦截
 */
@Component
public class PermissionInterceptor implements HandlerInterceptor {

    @Autowired
    private IPermissionService permissionService;

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        /**
         *  思路：
         *     1获取登录用户的信息
         *     2判断用户是否是超级管理员
         *       2.1是超级管理员，则可访问所有的方法
         *       2.2 不是超级管理员：
         *          1）如果访问的方法没有贴自定义的注解，则可直接访问
         *          2）如果访问方法有贴自定义注解：获取这个访问的这个处理方法的全权注解，
         *            拿这个注解和当前登录用户所拥有的权限做对比，如果这个方法的权限注解包含在登录用户的权限中
         *            则可访问，如果不在，则不能访问
         */
        HttpSession session = request.getSession();
        Employee employee =(Employee) session.getAttribute("EMPLOYEE_IN_SESSION");
        // 1 是超级管理员，直接放行
        if (employee.isAdmin()){ // 超管，放行
            return true;
        }
        // 2 不是超级管理员，获取访问方法上是否贴有权限注解
        HandlerMethod method =(HandlerMethod) handler;
        RequiredPermission anno = method.getMethodAnnotation(RequiredPermission.class);
        if (anno == null){ // 3 处理方法没有贴注解，直接放行
            return true;
        }
        // 4 处理方法贴有注解， 判断登录用户是否包含这个权限注解
        // 获取当前登录用户的角色  --->  获取当前用户所拥有的权限
        String expression = anno.expression();
        List<String> permissions = permissionService.selectPermissionsByEmpId(employee.getId());
        if (permissions.contains(expression)) {
            return true;
        }
        // 跳转 permission 的处理方法
         response.sendRedirect("/permission/noPermission");
        //request.getRequestDispatcher("/templates/common/nopermission.html").forward(request, response);
        return false;
    }
}
